package qc.module.platform.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.exception.QCPromptException;
import qc.common.core.tree.TreeDataDto;
import qc.module.platform.dto.role.*;
import qc.module.platform.service.RoleService;

import java.util.List;

/**
 * RoleController
 *
 * @author QuCheng Tech
 * @create 2023/1/9
 */
@RestController
@RequestMapping("/role")
public class RoleController {
    private RoleService roleService;

    @Autowired
    public void setRoleService(RoleService roleService) {
        this.roleService = roleService;
    }

    //是否为逻辑删除，为true表示逻辑删除--修改记录标记，为false表示物理删除--从数据库表中删除记录
    private static final boolean isLogicDelete = false;

    /**
     * 按照项目编号查询角色
     *
     * @param dto 查询条件
     * @return 返回角色详细信息
     */
    @RequestMapping(value = "/query", method = {RequestMethod.GET, RequestMethod.POST})
    public List<RoleDto> query(@RequestBody RoleQueryConditionDto dto) throws Exception {
        return roleService.query(dto);
    }

    /**
     * 按照id获取角色
     *
     * @param id 角色id
     * @return 角色详细信息
     */
    @GetMapping("/get")
    public RoleDto getByParam(@RequestParam(required = true) Integer id) throws Exception {
        return roleService.get(id);
    }

    /**
     * 按照id获取角色
     *
     * @param id 角色id
     * @return 角色详细信息
     */
    @GetMapping("/get/{id}")
    public RoleDto getByPath(@PathVariable(required = true) int id) throws Exception {
        return roleService.get(id);
    }

    /**
     * 新增角色
     *
     * @param dto 新增角色信息
     * @return 成功返回null
     */
    @RequestMapping(value = "/add", method = {RequestMethod.GET, RequestMethod.POST})
    public String add(@RequestBody RoleDto dto) {
        return roleService.add(dto);
    }

    /**
     * 修改角色
     *
     * @param dto 用户信息
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng
     */
    @RequestMapping(value = "/update", method = {RequestMethod.POST, RequestMethod.PUT})
    public String update(@RequestBody RoleDto dto) {
        return roleService.update(dto);
    }

    /**
     * 删除角色
     *
     * @param id 角色ID
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng
     */
    @RequestMapping(value = "/delete", method = {RequestMethod.DELETE})
    public String deleteByParam(@RequestParam int id) {
        return roleService.delete(id, isLogicDelete);
    }

    /**
     * 删除角色
     *
     * @param id 角色ID
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng
     */
    @RequestMapping(value = "/delete/{id}", method = {RequestMethod.DELETE})
    public String deleteByPath(@PathVariable int id) {
        return roleService.delete(id, isLogicDelete);
    }

    /**
     * 获取角色用户关联关系
     *
     * @param id 角色id
     * @return 角色用户关联简要信息
     * @author QuCheng
     */
    @RequestMapping(value = "/getusers", method = {RequestMethod.GET})
    public List<RoleUserDto> getRoleUsersByParam(@RequestParam int id) throws QCPromptException {
        return roleService.getRoleUsers(id);
    }

    /**
     * 获取角色用户关联关系
     *
     * @param id 角色id
     * @return 角色用户关联简要信息
     * @author QuCheng
     */
    @RequestMapping(value = "/getusers/{id}", method = {RequestMethod.GET})
    public List<RoleUserDto> getRoleUsersByPath(@PathVariable int id) throws QCPromptException {
        return roleService.getRoleUsers(id);
    }

    /**
     * 设置角色与用户关联关系
     *
     * @param dto 角色与用户关联关系
     * @return 成功返回null
     * @throws QCPromptException
     */
    @RequestMapping(value = "/setusers", method = {RequestMethod.GET, RequestMethod.POST})
    public String setRoleUsers(@RequestBody RoleUserSetDto dto) {
        return roleService.setRoleUsers(dto);
    }

    /**
     * 获取角色菜单关联关系
     *
     * @param id 角色id
     * @return 角色菜单关联简要信息
     * @author QuCheng
     */
    @RequestMapping(value = "/getmenus", method = {RequestMethod.GET})
    public List<RoleMenuDto> getRoleMenusByParam(@RequestParam int id) throws QCPromptException {
        return roleService.getRoleMenus(id);
    }

    /**
     * 获取角色菜单关联关系
     *
     * @param id 角色id
     * @return 角色菜单关联简要信息
     * @author QuCheng
     */
    @RequestMapping(value = "/getmenus/{id}", method = {RequestMethod.GET})
    public List<RoleMenuDto> getRoleMenusByPath(@PathVariable int id) throws QCPromptException {
        return roleService.getRoleMenus(id);
    }

    /**
     * 设置角色和菜单的关联关系
     *
     * @param dto 关联条件
     * @return 成功返回null
     */
    @RequestMapping(value = "/setmenus", method = {RequestMethod.GET, RequestMethod.POST})
    public String setRoleMenus(@RequestBody RoleMenuSetDto dto) {
        return roleService.setRoleMenus(dto);
    }
    
    /**
     * 获取角色部门关联关系
     *
     * @param id 角色id
     * @return 角色部门关联简要信息
     * @author QuCheng
     */
    @RequestMapping(value = "/getdepts", method = {RequestMethod.GET})
    public List<RoleDeptDto> getRoleDeptsByParam(@RequestParam int id) throws QCPromptException {
        return roleService.getRoleDepts(id);
    }

    /**
     * 获取角色部门关联关系
     *
     * @param id 角色id
     * @return 角色部门关联简要信息
     * @author QuCheng
     */
    @RequestMapping(value = "/getdepts/{id}", method = {RequestMethod.GET})
    public List<RoleDeptDto> getRoleDeptsByPath(@PathVariable int id) throws QCPromptException {
        return roleService.getRoleDepts(id);
    }

    /**
     * 设置角色和部门的关联关系
     *
     * @param dto 关联条件
     * @return 成功返回null
     */
    @RequestMapping(value = "/setdepts", method = {RequestMethod.GET, RequestMethod.POST})
    public String setRoleDepts(@RequestBody RoleDeptSetDto dto) {
        return roleService.setRoleDepts(dto);
    }

    /**
     * 以树形结构返回结果，按部门的上下级关系列出所有部门；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2023/9/7
     */
    @RequestMapping(value = "/getdeptstree", method = {RequestMethod.POST, RequestMethod.GET})
    public TreeDataDto getRoleDeptsTreeByParam(@RequestParam int id) throws QCPromptException {
        return roleService.getRoleDeptsTree(id);
    }


    /**
     * 以树形结构返回结果，按部门的上下级关系列出所有部门；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2023/9/7
     */
    @RequestMapping(value = "/getdeptstree/{id}", method = {RequestMethod.POST, RequestMethod.GET})
    public TreeDataDto getRoleDeptsTreeByPath(@PathVariable int id) throws QCPromptException {
        return roleService.getRoleDeptsTree(id);
    }

    /**
     * 以树形结构返回结果，按菜单的上下级关系列出所有菜单；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2023/9/7
     */
    @RequestMapping(value = "/getmenustree", method = {RequestMethod.POST, RequestMethod.GET})
    public TreeDataDto getRoleMenusTreeByParam(@RequestParam int id) throws QCPromptException {
        return roleService.getRoleMenusTree(id);

    }

    /**
     * 以树形结构返回结果，按菜单的上下级关系列出所有菜单；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2023/9/7
     */
    @RequestMapping(value = "/getmenustree/{id}", method = {RequestMethod.POST, RequestMethod.GET})
    public TreeDataDto getRoleMenusTreeByPath(@PathVariable int id) throws QCPromptException {
        return roleService.getRoleMenusTree(id);
    }

    /**
     * 以树形结构返回结果，树形结构一级节点为部门，二级节点为部门或部门中的用户；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2023/9/8
     */
    @RequestMapping(value = "/getuserstree", method = {RequestMethod.POST, RequestMethod.GET})
    public TreeDataDto getRoleUsersTreeByParam(@RequestParam int id) throws QCPromptException {
        return roleService.getRoleUsersTree(id);

    }

    /**
     * 以树形结构返回结果，树形结构一级节点为部门，二级节点为部门或部门中的用户；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2023/9/8
     */
    @RequestMapping(value = "/getuserstree/{id}", method = {RequestMethod.POST, RequestMethod.GET})
    public TreeDataDto getRoleUsersTreeByPath(@PathVariable int id) throws QCPromptException {
        return roleService.getRoleUsersTree(id);
    }

    /**
     * 获取角色API关联关系
     *
     * @param id 角色ID
     * @return List<RoleAPIDto>
     * @author QuCheng Tech
     * @since 2024/5/7
     */
    @RequestMapping(value = "/getapis",method = {RequestMethod.GET})
    public List<RoleAPIDto> getRoleApisByParam(@RequestParam Integer id){
        return roleService.getRoleApis(id);
    }

    /**
     * 获取角色API关联关系
     *
     * @param id 角色ID
     * @return List<RoleAPIDto>
     * @author QuCheng Tech
     * @since 2024/5/7
     */
    @RequestMapping(value = "/getapis/{id}",method = {RequestMethod.GET})
    public List<RoleAPIDto> getRoleApisByPath(@PathVariable Integer id){
        return roleService.getRoleApis(id);
    }

    /**
     * 以树形结构返回结果，按Api接口分组分2级列出所有接口；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2024/5/10
     */
    @RequestMapping(value = "/getapistree",method = {RequestMethod.GET})
    public TreeDataDto getRoleApisTreeByParam(@RequestParam Integer id) throws QCPromptException {
        return roleService.getRoleApisTree(id);
    }

    /**
     * 以树形结构返回结果，按Api接口分组分2级列出所有接口；
     *
     * @param id: 角色id
     * @return TreeDataDto 返回结果集
     * @author QcCheng Tech
     * @date 2024/5/10
     */
    @RequestMapping(value = "/getapistree/{id}",method = {RequestMethod.GET})
    public TreeDataDto getRoleApisTreeByPath(@PathVariable Integer id) throws QCPromptException {
        return roleService.getRoleApisTree(id);
    }

    /**
     * 设置角色API关联关系
     * 
     * @param dto
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng Tech
     * @since 2024/5/8
     */
    @RequestMapping(value = "/setapis",method = {RequestMethod.GET,RequestMethod.POST})
    public String setRoleApis(@RequestBody RoleAPISetDto dto){
        return roleService.setRoleApis(dto);
    }

}
